﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for Queries
/// </summary>
/// 
namespace webappdotnet{
    public class Queries
    {
        static DataClassesDataContext context = new DataClassesDataContext();

        public static List<Leerling> getLeerlingenByGroepCode(string groepCode)
        {

            var query = from l in context.Leerlings
                        where l.klas.Equals(groepCode)
                        select l;
            return query.ToList<Leerling>();
        }
        public static List<Leerling> getAlleLeerlingen()
        {
            var query = from l in context.Leerlings
                        select l;
            return query.ToList<Leerling>();
        }

        public static string getKlas(string leerling)
        {
            string query = (from l in context.Leerlings
                            where (l.naam.Equals(leerling))
                            select l.klas).First();
            return query;
        }


        public static List<Opdracht> getOpdrachtenByLeerlingNaam(string naam)
        {

            var query = from o in context.leerlingOpdrachts

                        where (o.leerlingID.Equals(getLeerlingIDByNaam(naam)))
                        select o.Opdracht;
            return query.ToList<Opdracht>();
        }

        public static int getLeerlingIDByNaam(string naam)
        {
            var query = from o in context.Leerlings

                        where (o.naam.Equals(naam))
                        select o.leerlingID;

            return query.ToList<int>().First();
        }

        public static List<String> getUniekeKlassen()
        {
            var query = (from l in context.Leerlings
                         select l.klas).Distinct();

            return query.ToList<String>();
        }

        public static bool IsLeerling(string username)
        {

            var users = from u in context.Leerlings
                        where (u.naam.Equals(username))
                        select u;

            if (users.Count() > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public static void addOpdracht(DateTime datum, int moeilijkheidsgraad, int maxScore)
        {
            Opdracht o = new Opdracht();
            o.maxScore = maxScore;
            o.moeilijkheidsGraad = moeilijkheidsgraad;
            o.opdraDatum = datum;
            context.Opdrachts.InsertOnSubmit(o);
            context.SubmitChanges();
        }

        public static int getIDLaatsteOpdracht()
        {
            try
            {
                int opdrachtID = (from o in context.Opdrachts
                                  select o.opdrachtID).Max();
                return opdrachtID;
            }
            catch (Exception) { return 1; }
        }

        public static void voegLeerlingMetOpdrachtToe(int leerlingID, int opdrachtID)
        {
            leerlingOpdracht o = new leerlingOpdracht();
            o.leerlingID = leerlingID;
            o.opdrachtID = opdrachtID;
            context.leerlingOpdrachts.InsertOnSubmit(o);
            context.SubmitChanges();
        }

        public static Leerling getLeerlingByID(int id)
        {
            var query = (from u in context.Leerlings
                         where (u.leerlingID.Equals(id))
                         select u).First();
            return (Leerling)query;
        }

        public static void voegOpdrachtDetailToe(int opdrachtid, String opgave, String oplossing)
        {
            OpdrachtDetail o = new OpdrachtDetail();
            o.opdrachtID = opdrachtid;
            o.opgaveTekst = opgave;
            o.oplossingTekst = oplossing;
            context.OpdrachtDetails.InsertOnSubmit(o);
            context.SubmitChanges();
        }

        public static void voegLeerlingOpdrachtDetailToe(int opdrachtDetailID, int leerlingID, bool fout, string antwoordTekst)
        {
            LeerlingOpdrachtDetail o = new LeerlingOpdrachtDetail();
            o.opdrachtDetailID = opdrachtDetailID;
            o.leerlingID = leerlingID;
            o.fout = fout;
            o.antwoordTekst = antwoordTekst;
            context.LeerlingOpdrachtDetails.InsertOnSubmit(o);
            context.SubmitChanges();
        }

        public static bool GetStatus(int opdrachtid)
        {
            bool query = false;
             query = Convert.ToBoolean((from l in context.Opdrachts
                            where (l.opdrachtID.Equals(opdrachtid))
                            select l.status).First());
            return query;
        }
        public static void SetStatus(bool status, int opdrachtid)
        {
            Opdracht o =  (from l in context.Opdrachts
                          where(l.opdrachtID.Equals(opdrachtid))
                          select l).First();
            o.status=status;
            context.SubmitChanges();
        }

        public static Opdracht getOpdrachtById(int id)
        {
            var query = from l in context.Opdrachts
                        where l.opdrachtID == id
                        select l;

            return query.First();
        }

        /**
         * Pure SQL
         * */

        public static void DeleteOpdracht(int opdrachtid)
        {
            context.ExecuteCommand("DELETE FROM leerlingOpdracht WHERE  (opdrachtID = " + opdrachtid + ")");
            context.ExecuteCommand("DELETE FROM OpdrachtDetail WHERE        (opdrachtID = " + opdrachtid + ")");
            context.ExecuteCommand("DELETE FROM Opdracht WHERE        (opdrachtID = " + opdrachtid + ")");

        }

        public static int AantalLeerlingenVoorOpdracht(int opdrachtid)
        {
            var query = context.ExecuteQuery<int>("SELECT COUNT(leerlingID) AS Expr1 FROM leerlingOpdracht WHERE (opdrachtID = " + opdrachtid + ")");
            return query.First();
        }

        public static int AantalLeerlingenDieOpdrachtInvulden(int opdrachtid)
        {
            string q = @"SELECT        COUNT(DISTINCT leerlingID) AS Expr1
FROM            LeerlingOpdrachtDetail
WHERE        (opdrachtDetailID IN
                             (SELECT        opdrachtDetailID
                               FROM            OpdrachtDetail
                               WHERE        (opdrachtID = " + opdrachtid + ")))";
            var query = context.ExecuteQuery<int>(q);
            return query.First();
        }

        public static bool HeeftAlGeantwoord(int opdrachtid, int leerlingid)
        {
            string q = @"
SELECT        COUNT(leerlingID) AS Expr1
FROM            LeerlingOpdrachtDetail
WHERE        (leerlingID = " + leerlingid + @") AND (opdrachtDetailID IN
                             (SELECT        opdrachtDetailID
                               FROM            OpdrachtDetail
                               WHERE        (opdrachtID = " + opdrachtid + ")))";
            var query = context.ExecuteQuery<int>(q);
             if (query.First()>0) return true;
            return false;
        }

        public static int GetTotaalOpgaves(int opdrachtid)
        {
            var query = context.ExecuteQuery<int>("SELECT COUNT(opgaveTekst) AS Expr1 FROM OpdrachtDetail WHERE (opdrachtID = " + opdrachtid + ")");
            return query.First();
        }

        public static int GetVooruitgangOpgaves(int opdrachtid, int leerlingid)
        {
            var query = context.ExecuteQuery<int>("SELECT COUNT(opgaveTekst) AS Expr1 FROM OpdrachtDetail WHERE (opdrachtID = " + opdrachtid + ") AND (opdrachtDetailID NOT IN (SELECT opdrachtDetailID FROM LeerlingOpdrachtDetail AS LeerlingOpdrachtDetail_1 WHERE (leerlingID = " + leerlingid + ") AND (OpdrachtDetail.opdrachtID = " + opdrachtid + ")))");

            return query.First();
        }

    }
}
